<?php
/**
 * 获得当前用户对某一资源的所有权限
 * 当前用户需要缓存用户的组id,以及用户的默认角色以及角色对应的默认权限
 *
 * 在做判断时如果返回false，表示用户不可以访问此资源，如果返回的列表为空，表示可以访问此资源，但无任何权限
 *
 * @param 资源类型 $resource_type
 * @param 资源id $resource_id
 * @return false or perm list
 */
/*
function get_resource_perm($resource_type,$resource_id)
{
	global $db,$current_user;
	//获得用户当前组
	$groups = $current_user['groups'];
	//获得用户可以访问此资源的组
	$sql='select gid from edufe_group_view where viewtype='.$resource_type.' and vid='.$resource_id.' and gid in ('.implode(',',$groups).')';
	$res = $db->query($gids);
	$gids = array();
	if(is_array($res))
	{
		foreach ($res as $v)
		{
			$gids[] = $v['gid'];
		}
	}
	if(!is_array($gids) || sizeof($gids) == 0) //如果用户所在组不能访问此资源
	{
		return false;
	}
	return get_perms($gids);
}*/

/**
 * 获得当前用户能访问的某类资源
 * 
 * 用法，先获得当前用户可访问的某类资源的资源id集合，再根据id和相关的条件去查找资源
 *
 * @param unknown_type $resource_type
 * @return   false or array() false 表示资源类型不正确
 */
function get_view_resource($resource_type)
{
	global $db,$current_user;
	//获得用户当前组
	$groups = $current_user['groups'];
	$sql = 'select vid from edufe_group_view where status='.STATUS_NORMAL.' and view_type="'.$resource_type.'" and g_id in (\''.implode("','",$groups).'\')';
	$res = $db->query($sql);
	$ids = array();
	if(is_array($res))
	{
		foreach ($res as $v)
		{
			$ids[$v['vid']] = $v['vid'];
		}
	}
	return $ids;
}

/**
 * 获得某一用户具有的权限元，可用来判断是否对某一功能点有权限
 *
 * @return unknown
 */
function get_function_point_perm()
{
	global $db,$current_user;
	//获得用户当前组
	$groups = $current_user['groups'];
	return get_perms($groups);
}

/**
 * 验证是否具有功能点权限
 *
 */
function check_perms($code,$perms = false)
{
	global $current_user;
	if($current_user['usertype']==USER_TYPE_SUPER)
	{
		return true;
	}
	$perms = $perms==false ? $current_user['perms'] : $perms;
	if(!is_array($perms))
	{
		return false;
	}
	return in_array($code,$perms);
}

/**
 * 判断当前用户在指定组下具有哪些权限
 *
 * @param unknown_type $gourps
 * @return unknown
 */
function get_perms($groups)
{
	global $db,$current_user;
	$permlist = array();
	$default_rids = array_keys($current_user['roles']);
	foreach ($groups as $gid)
	{
		//获得用户在此组中自定义的角色
		$res = $db->query('select r_id from edufe_group_user_role where status='.STATUS_NORMAL.' and  g_id=\''.$gid.'\' and u_id=\''.$current_user['userid'].'\'');
		$rids = array();
		if(is_array($res))
		{
			foreach ($res as $v)
			{
				$rids[] = $v['r_id'];
			}
		}
		if(!is_array($rids) || sizeof($rids) ==0) //如果没有自定义角色，则扮演默认角色
		{
			$rids = $default_rids;
		}
		if(is_array($rids) && sizeof($rids)>0)
		{
			foreach ($rids as $rid)
			{
				//获得此组中该角色的自定义权限
				$db->prepare('select grp_permids from edufe_group_role_perm where status='.STATUS_NORMAL.' and g_id=? and roleid=?');
				$db->set_string($gid);
				$db->set_string($rid);
				$tmp_perms = $db->execute(true);
				if(isset($tmp_perms['grp_permids']))
				{
					//如果使用自定义权限，则将自定义权限合并到权限表中
					$permlist = array_merge($permlist,explode(',',$tmp_perms['grp_permids']));
				}
				else 
				{
					//如果使用默认权限，则将默认权限合并到权限表中
					$permlist = array_merge($permlist,explode(',',$current_user['roles'][$rid]['elements']));
				}
			}
		}
	}
	$permlist = array_unique($permlist);
	return $permlist;
}

/**
 * 获得某一组可以浏览的指定类型的资源
 *
 * @param int $gid
 * @param varchar $view_type
 * @return array
 */
function get_group_views($gid,$view_type)
{
	global $db;
	$cache = get_cache_obj();
	$list = $cache->get('group_view_' . $gid . '_' . $view_type);
	if($list==false)
	{
		$db->prepare('select vid,view_type from ' . DB_PRE . 'group_view where status='.STATUS_NORMAL.' and g_id=? and view_type=?');
		$db->set_string($gid);
		$db->set_string($view_type);
		$list = $db->execute();
		if(!is_array($list) || sizeof($list) <=0)
		{
			return false;
		}
		$cache->set('group_view_' . $gid . '_' . $view_type, serialize($list));
	}
	else 
	{
		$list = unserialize($list);
	}
	return $list;
}

/**
 * 检测某用户是否有访问某资源的权限
 * @author menghao
 * @global <type> $current_user
 * @param <type> $username 用户名
 * @param <type> $vtype  资源类型
 * @param <type> $vid 资源id
 * @return <type> 有权限返回true 否则为false
 */
function can_view_resource($username, $vtype, $vid)
{
    global $current_user;
    //检测是否具有当前站点的权限
    foreach ($current_user['groups'] as $group)
    {
        $views = get_group_views($group,'site');
        foreach($views as $view)
        {
            if($view['view_type'] == $vtype && $view['vid'] == $vid)
            {
               return true;
            }
        }
    }
    return false;
}

/**
 * 获得指定资源类型所有资源对于当前用户具有的权限元
 *
 * @param varchar $resource_type
 * @return array
 */
function get_user_resource_list($resource_type)
{
	global $db,$current_user;
	//用户不属于任何组，将不具备任何资源权限
	if(!isset($current_user['groups']) || !is_array($current_user['groups']) || sizeof($current_user['groups']) <= 0)
	{
		return array();
	}
	//获取所有角色信息
	$role_res = $db->query('select roleid,elements from ' . DB_PRE . 'role where status='.STATUS_NORMAL);
	$role_list = array();
	if(is_array($role_res))
	{
		foreach ($role_res as $role)
		{
			$role_list[$role['roleid']] = explode(',',$role['elements']);
		}
	}
	//获取该用户所在组的所有自定义角色
	$db->prepare('select * from ' . DB_PRE . 'group_user_role where status=? and u_id=?');
	$db->set_int(STATUS_NORMAL);
	$db->set_string($current_user['userid']);
	$res = $db->execute();
	$user_roles = array();
	if(is_array($res))
	{
		foreach ($res as $r)
		{
			if(!isset($user_roles[$r['g_id']]))
			{
				$user_roles[$r['g_id']] = array();
			}
			$user_roles[$r['g_id']][] = $r;
		}
	}
	$res = '';
	//获得该用户所在组中所有自定义的角色权限
	$res = $db->query('select * from ' . DB_PRE . 'group_role_perm where status='.STATUS_NORMAL.' and g_id in (\''.implode("','", $current_user['groups']).'\')');
	$self_g_r_perm = array();
	if(is_array($res))
	{
		foreach ($res as $v)
		{
			$self_g_r_perm[$v['g_id'].'_'.$v['roleid']] = explode(',', $v['grp_permids']);
		}
	}
	$view_list = array();
	foreach ($current_user['groups'] as $group)
	{
		//获得某一组可以浏览的指定类型的资源
		$views = get_group_views($group,$resource_type);
		if(is_array($views))
		{
			foreach ($views as $view)
			{
				if(!isset($view_list[$view['vid']]))
				{
					$view_list[$view['vid']] = array();
				}
				//如果该组中为当前用户指定了自定义角色，则用户为自定义角色，默认角色在本组中取消
				if(isset($user_roles[$group]) && sizeof($user_roles[$group]) > 0)
				{
					foreach ($user_roles[$group] as $v)
					{
						if(isset($role_list[$v['r_id']]) || isset($self_g_r_perm[$group . '_' . $v['r_id']]))
						{
							//如果本组自定义了当前角色的权限，则使用当前角色权限，默认角色权限取消
							$tmp_role = isset($self_g_r_perm[$group . '_' . $v['r_id']]) ? $self_g_r_perm[$group . '_' . $v['r_id']] : $role_list[$v['r_id']];
							$view_list[$view['vid']] = array_merge($view_list[$view['vid']], $tmp_role);
							$view_list[$view['vid']] = array_unique($view_list[$view['vid']]);
						}
					}
				}
				else 
				{
					if(is_array($current_user['roles']))
					{
						foreach ($current_user['roles'] as $k=>$v)
						{
							$tmp_role = isset($self_g_r_perm[$group . '_' . $k]) ? $self_g_r_perm[$group . '_' . $k] : explode(',', $v['elements']);
							$view_list[$view['vid']] = array_merge($view_list[$view['vid']], $tmp_role);
							$view_list[$view['vid']] = array_unique($view_list[$view['vid']]);
						}
					}
				}
			}
		}
		
	}
	//返回指定资源类型所有资源对于当前用户具有的权限元
	return $view_list;
}
?>